package need_learn.coding.ali;
/**
 * TODO 阿里 实现单例模式的各种写法，面试要求:请写出懒加载并且线程安全的单例模式，并且兼顾效率
 *
 * @author david
 * @version 1.0
 * @date 2021/4/20 14:56
 */
public class Singleton {
    //这里是volatile 不是 final 提供可见性并保证不被指令重排 才可以实现线程安全
    private volatile static Singleton instance = null;
    // 私有化构造方法
    private Singleton() {
    }
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

}
//饿汉
class Singleton2 {
    private static final Singleton2 instance = new Singleton2();

    // 私有化构造方法
    private Singleton2() {
    }
    public static Singleton2 getInstance() {
        return instance;
    }

}

//使用枚举
 enum Singleton3 {
    uniqueInstance;// 定义一个枚举的元素，它 就代表了Singleton的一个实例
    public void singletonOperation() {
        // 功能处理
        System.err.println("功能处理");
    }

}
